package br.ufrn.sipac.patrimonio.coletor.controller;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import android.content.Context;
import br.ufrn.sipac.patrimonio.auxiliares.ConstantesOperacoes;
import br.ufrn.sipac.patrimonio.coletor.dominio.Persistencia;
import br.ufrn.sipac.patrimonio.coletor.dominio.Unidade;
import br.ufrn.sipac.patrimonio.coletor.exception.DatabaseException;
import br.ufrn.sipac.patrimonio.coletor.exception.TransmissaoException;
import br.ufrn.sipac.patrimonio.coletor.helper.DatabaseHelper;
import br.ufrn.sipac.patrimonio.coletor.transmissao.GenericSOAP;

public class AutenticacaoController {
	private static String login;
	private static String senha;
	public static boolean autenticado = false;
	public static Collection<Unidade> unidadesPermitidas = new ArrayList<Unidade>();

	/**
	 * Efetua o login do usuário ou acessa de modo offline.
	 * 
	 * @return
	 * @throws TransmissaoException
	 */
	public static boolean logar(Context context) throws TransmissaoException {
		if (MainController.getTipoOperacao() == ConstantesOperacoes.MODO_ONLINE) {
			GenericSOAP gen = new GenericSOAP();
			autenticado = gen.autenticar(getLogin(), getSenha(), context);
		} else {
			// Modo offline
			return true;
		}
		return autenticado;
	}

	public static Collection<Unidade> findUnidadesPermissao(Context context)
			throws DatabaseException, TransmissaoException {

		Collection<Unidade> unidades = new ArrayList<Unidade>();
		GenericSOAP gen = new GenericSOAP();
		Collection<Object> objs = gen.findUnidadesPermissao(login, context);

		for (Object ob : objs) {
			Unidade unidadeDTO = (Unidade) ob;
			unidades.add(unidadeDTO);
			// Salva ou atualiza os dados localmente
			try {
				Persistencia unidadeBD = DatabaseHelper.getHelper(context)
						.getUnidadeDAO().queryForId(unidadeDTO.getId());
				if (unidadeBD == null)
					DatabaseHelper.getHelper(context).getUnidadeDAO()
							.create(unidadeDTO);
				else
					DatabaseHelper.getHelper(context).getUnidadeDAO()
							.update(unidadeDTO);
			} catch (SQLException e) {
				throw new DatabaseException(e.getMessage(), context);
			}
		}
		unidadesPermitidas = unidades;

		return unidades;
	}

	public static String getLogin() {
		return login;
	}

	public static void setLogin(String login) {
		AutenticacaoController.login = login;
	}

	private static String getSenha() {
		return senha;
	}

	public static void setSenha(String senha) {
		AutenticacaoController.senha = senha;
	}
}
